﻿using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Linq;
using System.Text;
using DAL;
using DTO;

namespace BLL
{
    public class UserBLL
    {
        static int id = 0;
        HospitalDataContext DB = new HospitalDataContext();
        public string Insert(UserDTO user)
        {
            try
            {
                User u = new User();
                u.UserID = (id++);
                u.StaffID = user.StaffID;
                u.Password = getMd5Hash(user.Password);
                u.Role = user.Role;
                u.Status = user.Status;

                DB.Users.InsertOnSubmit(u);
                DB.SubmitChanges();
                return "success";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
        public static string getMd5Hash(string input)
        {
            // Create a new instance of the MD5CryptoServiceProvider object.
            MD5 md5Hasher = MD5.Create();

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }

        // Verify a hash against a string.
        public static bool verifyMd5Hash(string input, string hash)
        {
            // Hash the input.
            string hashOfInput = getMd5Hash(input);

            // Create a StringComparer an compare the hashes.
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;

            if (0 == comparer.Compare(hashOfInput, hash))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public IQueryable Select()
        {
            return DB.Users.Join(
                DB.Staffs,
                a => a.StaffID,
                b => b.StaffID,
                (a, b) => new
                {
                    a.StaffID,
                    Name = b.FirstName+" "+b.LastName,
                    a.Role,
                    a.Status
                }
                ).Distinct().AsQueryable();

        }
        public bool CheckLogin(string username, string password)
        {
            string hashpass;
            hashpass=getMd5Hash(password);
            int count= DB.Users.Where(s => s.StaffID == username && s.Password == hashpass&&s.Status=="Enable").Count();
            if (count > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public string getRole(string username)
        {
            User user = DB.Users.Where(s => s.StaffID == username).FirstOrDefault();
            return user.Role;
        }
        public string getWardID(string username)
        {
            return DB.Staffs.Join(
                DB.Jobs,
                a => a.StaffID,
                b => b.StaffID,
                (a, b) => new
                {
                    b.JobID,
                    a.StaffID,
                    b.FinishDate

                }
                ).Join(
                DB.StaffOfWards,
                c => c.JobID,
                d => d.JobID,
                (c, d) => new
                {
                    c.StaffID,
                    FinishDate1 = c.FinishDate,
                    d.WardID,
                    FinishDate2 = d.FinishDate
                }
                ).Join(
                    DB.Wards,
                    e => e.WardID,
                    f => f.WardID,
                    (e, f) => new
                    {
                        e.StaffID,
                        e.FinishDate1,
                        e.FinishDate2,
                        e.WardID,
                        f.WardName
                    }
                ).Where(s => s.StaffID == username && s.FinishDate1 == null && s.FinishDate2 == null).AsQueryable().FirstOrDefault().WardID;


        }
        public string getWardName(string username)
        {
            return DB.Staffs.Join(
                DB.Jobs,
                a => a.StaffID,
                b => b.StaffID,
                (a, b) => new
                {
                    b.JobID,
                    a.StaffID,
                    b.FinishDate

                }
                ).Join(
                DB.StaffOfWards,
                c => c.JobID,
                d => d.JobID,
                (c, d) => new
                {
                    c.StaffID,
                    FinishDate1 = c.FinishDate,
                    d.WardID,
                    FinishDate2 = d.FinishDate
                }
                ).Join(
                    DB.Wards,
                    e => e.WardID,
                    f => f.WardID,
                    (e, f) => new
                    {
                        e.StaffID,
                        e.FinishDate1,
                        e.FinishDate2,
                        e.WardID,
                        f.WardName
                    }
                ).Where(s => s.StaffID == username && s.FinishDate1 == null && s.FinishDate2 == null).AsQueryable().FirstOrDefault().WardName;


        }
    }
}
